#include "ConfigApp.h"
#include "WirelessProtocols/Console.h"
#include "Transceivers/Transceivers.h"
#include "WirelessProtocols/SymbolTime.h"
#include "Transceivers/Security.h"
#include "WirelessProtocols/MCHP_API.h"
#include "TratamentoMensagem.h"
#include "TratamentoSerial.h"

#if ADDITIONAL_NODE_ID_SIZE > 0
BYTE AdditionalNodeID[ADDITIONAL_NODE_ID_SIZE] = {0x12};
#endif

#define reset() {__asm__ volatile ("RESET");}
#define  tamanhoVetorNos 15
#define true TRUE
#define bool BOOL
#define false FALSE
#define byte BYTE

int flagPassou1Seg = 0;
int teste = 0;
BYTE myChannel = 12;
int posRota = 0;
int Leds = 1;
int countTimer;
int flagReset = 0;
int countReset = 0;
int countTimerEstouro = 0;

void __attribute__((interrupt, auto_psv)) _T4Interrupt(void) {
    TMR4 = 0;
    PR4 = 60000;
    IFS1bits.T4IF = 0;
    flagPassou1Seg = 1;
}

void delay_ms(unsigned long delay) {
    __delay32(delay * 40000); // Espera X milisegundos
}

int main(void) {
    bool fazerRequisicao = false;
    BoardInit();
    ConsoleInit();
    MiApp_ProtocolInit(FALSE);
    MiApp_ConnectionMode(ENABLE_ALL_CONN);
    MiApp_SetChannel(myChannel);
    MiApp_EstablishConnection(0xff, CONN_MODE_DIRECT);
    LED_2 = 1;
    LED_1 = 1;
    DelayMs(1000);
    LED_2 = !LED_2;
    LED_1 = !LED_1;
    DelayMs(1000);
    LED_2 = !LED_2;
    LED_1 = !LED_1;

    IEC1bits.T4IE = 1;
    T4CONbits.TON = 0;
    T4CONbits.TCS = 0;
    T4CONbits.TCKPS0 = 1;
    T4CONbits.TCKPS1 = 1;
    T4CONbits.TGATE = 0;
    TMR4 = 0;
    PR4 = 60000;
    IFS1bits.T4IF = 0;
    T4CONbits.T32 = 0;
    T4CONbits.TON = 1;

    T6CONbits.TON = 0;
    T6CONbits.TCS = 0;
    T6CONbits.TCKPS0 = 1;
    T6CONbits.TCKPS1 = 1;
    T6CONbits.TGATE = 0;
    TMR6 = 0;
    PR6 = 4000;
    IFS2bits.T6IF = 0;
    T6CONbits.T32 = 0;

    bool controle = false;
    byte vetorPedidoSerial[60];
    int countVetorpedidoSerial = 0;
    while (1) {
        if (MiApp_MessageAvailable()) {
            int tempVisualizacao;
            while (!ConsoleIsPutReady());
            Printf("\r\n Mensagem recebida: ");
            for (tempVisualizacao = 0; tempVisualizacao < rxMessage.PayloadSize; tempVisualizacao++) {
                while (!ConsoleIsPutReady());
                PrintChar(rxMessage.Payload[tempVisualizacao]);
                while (!ConsoleIsPutReady());
                Printf(" ");
            }
            while (!ConsoleIsPutReady());
            Printf("\r\n");
            if ((rxMessage.Payload[0] == IDNovaRota) && (rxMessage.PayloadSize <= maxHops + 3)) {
                mensagemNovaRota(rxMessage);
            }
            MiApp_DiscardMessage();
        }
        if (possuiDado()) {
            byte temp = ConsoleGet();
            while (!ConsoleIsPutReady());
            Printf("\r\n");
            while (!ConsoleIsPutReady());
            ConsolePut((char) (temp));
            while (!ConsoleIsPutReady());
            //                Printf("  ");
            //                while (!ConsoleIsPutReady());
            //                PrintChar(temp);
            countReset = 0;
            //                if ((temp == StartBit232) && (!controle)) {
            //                    controle = true;
            //                } else if ((!(temp == StartBit232)) && (!(temp == StopBit232)) && (controle)) {
            //                    if (countVetorpedidoSerial < 60) {
            //                        vetorPedidoSerial[countVetorpedidoSerial] = temp;
            //                        countVetorpedidoSerial++;
            //                    }
            //                } else if ((temp == StopBit232) && (controle)) {
            //                    controle = false;
            //                    tratamentoMensagemProtocoloSerial(&vetorPedidoSerial[0], countVetorpedidoSerial);
            //                    countVetorpedidoSerial = 0;
            //                } else
            if (temp == IDMensagem232RTC) {
                mensagemRTC();
            } else if (temp == IDMensagem232RequisicaoDados) {
                mensagemServicoDados();
            } else if (temp == IDMensagem232ReqRtcDeNo) {
                mensagemReqDadosRtc();
            } else if (temp == IDMensagem232Rotas) {
                plotRotas();
            } else if (temp == IDMensagem232Ping) {
                mensagemPing();
            } else if (temp == IDMensagem232RTCUmNo) {
                mensagemRTCUmNo();
            } else if (temp == '+') {
                U2STAbits.OERR = 0;
            ClrWdt();
        }
        if (U2STAbits.OERR) {
            U2STAbits.OERR = 0;
        }
        if (fazerRequisicao) {
//            if (flagPassou1Seg == 1) {
//                flagPassou1Seg = 0;
//                countTimerEstouro++;
//                if (countTimerEstouro > 22) {
//                    countTimerEstouro = 0;
//                    int temp2;
//                    for (temp2 = 0; temp2 < 10; temp2++) {
//                        mensagemReqDados2(&vetorNos[temp2]);
//                        ClrWdt();
//                    }
//                }
            }
            ClrWdt();
        }
    }
}

